<#include "/templates/taglibs.ftl" />
<#include "/templates/function.ftl" />
<!DOCTYPE html>
<html lang="zh-cn">
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="${contextPath}/assets/plugins/layui/css/layui.css" media="all" />
        <style>
            p {
                margin-bottom: 10px;
                font-size: 15px;
                color: #393D49;
                font-weight: 400;
                line-height: 1.8;
            }
            .site-content {
                background-color: #fff;
                padding: 20px 0 10px 20px;
            }
            .site-h1 {
                margin-bottom: 20px;
                line-height: 60px;
                padding-bottom: 10px;
                color: #393D49;
                border-bottom: 1px solid #eee;
                font-size: 28px;
                font-weight: 400;
            }
        </style>
    </head>
    <body>
        <div class="layui-fluid layui-container">
            <div class="layui-row site-content">
                <div class="layui-col-md12">
                    <h1 class="site-h1">控制层Controller</h1>
                    <p>在SpringMVC 中，控制器Controller 负责处理由DispatcherServlet 分发的请求，它把用户请求的数据经过业务处理层处理之后封装成一个ModelMap，然后再把该ModelMap返回给对应的View 进行展示。</p>
                    <p>在项目中写控制层一般遵循下面的规范：</p>
                    <p>1.命名：服务名+Controller，例如：BsExampleInfoController。</p>
                    <p>2.定义Controller 的方法，只需使用注解@Controller 标记一个类是Controller 。</p>
                    <p>3.使用实体类接收上传的参数，并使用@ModelAttribute注解保存参数数据。</p>
                    <p>当 @ModelAttribute 标记在方法上的时候，该方法将在处理器方法执行之前执行，然后把返回的对象存放在 session 或模型属性中，属性名称可以使用 @ModelAttribute(“attributeName”) 在标记方法的时候指定，若未指定，则使用返回类型的类名称（首字母小写）作为属性名称。</p>
                    <p>4.一般控制类可以继承泛型类BaseController，类中定义了request、response、map、pageSize和pageNo变量和自定义了常用数据类型转换器。</p>
                    <p>5.使用@RequestMapping 、@PathVariable、@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射，这样的Controller 就能被外界访问到。</p>
                    <p>6.使用@Valid注解和BindingResult，使用该注解的对象数据，在方法执行前，会对传入对象的参数进行校验（按照实体属性上的校验规则机型校验），校验结果可以通过BindingResult拿到。</p>
                    <p>7.方法内的校验错误信息，也可以使用BindingResult管理错误信息，将错误校验信息统一返回给对应view</p>
                    <pre class="layui-code" lay-skin="notepad">
bindingResult.addError(new ObjectError("error code", "error message！"));
map.put("errorList", bindingResult.getAllErrors());
                     </pre>
                    <p>8.在return redirect前，要清空map。</p>
                    <pre class="layui-code" lay-skin="notepad">
map.clear();
return "redirect:management";
                     </pre>
                    
                    <fieldset class="layui-elem-field layui-field-title site-title">
                        <legend><a name="get">示例代码</a></legend> 
                    </fieldset>
                    <pre class="layui-code" lay-skin="notepad">
package org.stvd.controller.guide;

import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.stvd.common.aspectj.lang.annotation.Log;
import org.stvd.common.aspectj.lang.enums.BusinessType;
import org.stvd.common.security.SecurityUserHolder;
import org.stvd.common.utils.IdWorker;
import org.stvd.common.utils.InterfaceResult;
import org.stvd.controller.BaseController;
import org.stvd.core.dto.QueryResult;
import org.stvd.core.util.DateUtil;
import org.stvd.entities.guide.examples.BsExampleInfo;
import org.stvd.service.guide.examples.BsExampleInfoService;

/**
 * @Title BsExampleInfoController
 * @Describtion 演示数据控制层
 * @author houzx
 * @date 2022年6月1日
 */
@Controller
@RequestMapping(value = "guide/examples")
public class BsExampleInfoController extends BaseController{
    
    @Autowired
    private BsExampleInfoService exampleInfoService;
    
    private String tmpURL = "/guide/examples/";
    
    /**
     * 管理列表
     * @param exampleInfo
     * @return
     */
    @RequestMapping(value = "manage", method = {RequestMethod.GET, RequestMethod.POST})
    public String onManage(@ModelAttribute("exampleInfo") BsExampleInfo exampleInfo) {
        QueryResult<BsExampleInfo> queryResult = exampleInfoService.queryExampleInfoResult((pageNo - 1) * pageSize, pageSize, exampleInfo.getName());
        map.put("queryResult", queryResult);
        return tmpURL + "ExampleManage.html";
    }
    
    /**
     * 新增数据
     * @param exampleInfo
     * @return
     */
    @GetMapping(value = "add")
    public String onAddLoad(@ModelAttribute("exampleInfo") BsExampleInfo exampleInfo) {
        return tmpURL + "ExampleAdd.html";
    }

    @Log(title = "新增示例数据", businessType = BusinessType.INSERT)
    @PostMapping(value = "add")
    @ResponseBody
    public InterfaceResult<Map<String, Object>> onAddAction(
        @Valid @ModelAttribute("exampleInfo") BsExampleInfo exampleInfo, BindingResult bindingResult) {
        InterfaceResult<Map<String, Object>> result = new InterfaceResult<Map<String,Object>>();
        if (bindingResult.hasErrors()) {
            result.setError(bindingResult.getAllErrors().get(0).getDefaultMessage());
            return result;
        }
        exampleInfo.setId(IdWorker.getInstance().nextId());
        exampleInfo.setCreateUser(SecurityUserHolder.getCurrentUserId());
        exampleInfo.setCreateTime(DateUtil.getSystemDate());
        exampleInfoService.insert(exampleInfo);
        
        result.setMsg("新增成功！");
        return result;
    }

    /**
     * 修改数据
     * @param id
     * @return
     */
    @GetMapping(value = "edit/{id}")
    public String onEditLoad(@PathVariable Long id) {
        map.put("exampleInfo", exampleInfoService.findByPk(BsExampleInfo.class, id));
        return tmpURL + "ExampleEdit.html";
    }

    @Log(title = "修改示例数据", businessType = BusinessType.UPDATE)
    @PostMapping(value = "edit")
    @ResponseBody
    public InterfaceResult<Map<String, Object>> onEditAction(
        @Valid @ModelAttribute("exampleInfo") BsExampleInfo exampleInfo, BindingResult bindingResult) {
        InterfaceResult<Map<String, Object>> result = new InterfaceResult<Map<String,Object>>();
        if (bindingResult.hasErrors()) {
            result.setError(bindingResult.getAllErrors().get(0).getDefaultMessage());
            return result;
        }
        exampleInfo.setModifyTime(DateUtil.getSystemDate());
        exampleInfoService.update(exampleInfo);
        map.clear();
        
        result.setMsg("修改成功！");
        return result;
    }
    
    /**
     * 删除数据
     * @param id
     * @return
     */
    @Log(title = "删除参数信息", businessType = BusinessType.DELETE)
    @PostMapping(value = "del")
    @ResponseBody
    public InterfaceResult<Map<String, Object>> onDelete(Long id, String name){
        InterfaceResult<Map<String, Object>> result = new InterfaceResult<Map<String,Object>>();
        try {
            exampleInfoService.delete(BsExampleInfo.class, id);
            result.setMsg("‘" + name + "’删除成功！");
        } catch (Exception e) {
            e.printStackTrace();
            result.setError("删除" + name + "失败！<br/>失败原因：" + e.getMessage());
        }
        return result;
    }

}

                    </pre>
                </div>
            </div>
        </div>
    </body>
    <script type="text/javascript" src="${contextPath}/assets/plugins/layui/layui.js"></script>
    <script>
        layui.use('code', function(){ 
            layui.code({
                encode: true
            }); 
          });
    </script>
</html>